package org.example.evaluate.engine;

import lombok.Data;
import org.example.evaluate.enums.*;
import org.example.vo.EvaluateInfo;

import java.math.BigDecimal;
import java.math.RoundingMode;

@Data
public class EvaluatePhone {
    private BigDecimal init; // 原始价格
    private Version version;  // 版本
    private GuaranteePeriod gp;  // 保修期
    private Appearance appearance;  // 外观
    private StartingUp startingUp;  // 开机情况
    private Model model;  // 型号

    public void init(EvaluateInfo evaluateInfo, BigDecimal init) {

        this.init = init;
        this.version = Version.buildVersion(evaluateInfo.getVersion());
        this.gp = GuaranteePeriod.buildGuaranteePeriod(evaluateInfo.getGuaranteePeriod());
        this.appearance = Appearance.buildAppearance(evaluateInfo.getAppearance());
        this.startingUp = StartingUp.buildStartingUp(evaluateInfo.getStartingUp());
        this.model = Model.buildModel(evaluateInfo.getModel());
    }

    public BigDecimal begin() {
        switch (this.startingUp) {
            case nomal:  // 正常开机
                // 手机初始开价乘以能够正常开始的系数
                BigDecimal price = this.init.multiply(this.startingUp.getKf());
                return normalEvaluate(price).setScale(2, RoundingMode.HALF_UP);   // 四舍五入保留两位有效树数字
            case warn:   // 开机不正常(开机不正常出现死机/重启/不开机)
                // 一口价乘以外观
                return evaluateAppearance(StartingUp.warn.getKf());
            case error:   //无法正常开机使用(开机出现重启、死机、定屏、发烫、无法进入无法开机现象)
                // 一口价乘以外观
                return evaluateAppearance(StartingUp.error.getKf());
            case fatal:   // 无法开机(开机无反应，连接电脑、充电器等外置USB接口无任何反应。)
                // 一口价乘以外观
                return evaluateAppearance(StartingUp.fatal.getKf());
        }
        return BigDecimal.valueOf(0);
    }

    // 正常评估
    private BigDecimal normalEvaluate(BigDecimal price) {
        BigDecimal result = evaluateVersion(price);  // 评估版本
        result = evaluateGuaranteePeriod(result);  // 评估保修期
        result = evaluateModel(result); // 评估 型号
        // TODO XXX
        return evaluateAppearance(result);  // 评估外观
    }

    // 评估外观
    private BigDecimal evaluateAppearance(BigDecimal price) {
        return this.appearance.getKf().multiply(price);
    }

    // 评估版本
    private BigDecimal evaluateVersion(BigDecimal price) {
        return this.version.getKf().multiply(price);
    }

    private BigDecimal evaluateGuaranteePeriod(BigDecimal price) {
        return price.multiply(this.gp.getKf());
    }

    private BigDecimal evaluateModel(BigDecimal price) {
        return this.model.getKf().multiply(price);
    }
}
